package com.waikuai.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.waikuai.shop.dto.CreateOrderDTO;
import com.waikuai.shop.dto.OrderQueryDTO;
import com.waikuai.shop.entity.Order;
import com.waikuai.shop.vo.LogisticsVO;
import com.waikuai.shop.vo.OrderDetailVO;
import com.waikuai.shop.vo.OrderListVO;

import java.util.List;

/**
 * 订单服务接口
 * @author waikuai
 */
public interface OrderService extends IService<Order> {

    /**
     * 创建订单（从购物车结算）
     * @param createOrderDTO 创建订单请求
     * @param userId 用户ID
     * @return 订单ID
     */
    Long createOrder(CreateOrderDTO createOrderDTO, Long userId);

    /**
     * 支付订单（余额支付）
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param paymentPassword 支付密码
     * @return 支付结果
     */
    boolean payOrder(Long orderId, Long userId, String paymentPassword);

    /**
     * 查询订单列表（分页）
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<OrderListVO> getOrderPage(OrderQueryDTO queryDTO);

    /**
     * 查询订单列表（不分页）
     * @param userId 用户ID
     * @param orderStatus 订单状态（可选）
     * @return 订单列表
     */
    List<OrderListVO> getOrderList(Long userId, Integer orderStatus);

    /**
     * 查询订单详情
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 订单详情
     */
    OrderDetailVO getOrderDetail(Long orderId, Long userId);

    /**
     * 取消订单
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 取消结果
     */
    boolean cancelOrder(Long orderId, Long userId);

    /**
     * 更新订单状态（管理员操作）
     * @param orderId 订单ID
     * @param orderStatus 订单状态
     * @return 更新结果
     */
    boolean updateOrderStatus(Long orderId, Integer orderStatus);

    /**
     * 获取订单物流信息
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 物流信息
     */
    LogisticsVO getOrderLogistics(Long orderId, Long userId);

    /**
     * 管理员查询所有订单列表（分页、支持条件查询）
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<OrderListVO> getAdminOrderPage(OrderQueryDTO queryDTO);

    /**
     * 管理员查询订单详情（无需验证用户归属）
     * @param orderId 订单ID
     * @return 订单详情
     */
    OrderDetailVO getAdminOrderDetail(Long orderId);
}
